引言
vector是C++标准模板库中提供的一种能够操作多种数据结构的向量容器模板类。相对于C++语言中的普通数组,vector除了数组的大小可根据元素个数的多少动态改变外,它更大的优势或者说更吸引我们的是,它内部提供了大量的优化算法,如排序、查找、删除/替换、数值运算等等。另外,同普通数组一样,vector数组中内部元素采用的是连续存储空间来存储的,所以,也可以通过下标来访问其中的某个元素。
那么,对于我们程序中定义的普通数组,能不能将其转换为vector数组,或者说与vector数组混合使用,并利用它内部提供的各种算法呢?这种需求场合还是挺多的,如我们可能会写某个算法函数,然后将其封装成动态链接库DLL文件供其它程序调用。在DLL函数的参数类型定义中,一般我们不会将其定义成c++语言专用的如class、vector等类型,而是定义成通用的数据如int、double等类型,否则,在其它语言如python、LabVIEW等环境中调用DLL的时候,将不能正确识别参数的数据类型。
解决思路
实现将普通数组转换为vector数组并利用它内部提供的各种算法的目的,这里面涉及到两个重要环节:
怎样将普通数组的值传递到vector数组中?
使用vector的提供的各种算法进行处理后,得到的是vector类型的数组,怎么将其再转换为普通数组?
下面对这两个问题逐步说明。
普通数组转换为vector数组
假定普通数组为a定义为:double a[N],N为元素个数,转换后的vector数组定义为vector<int> v,则将a的所有元素传递到v的方式有以下两种:
1. 定义v时直接赋值,代码为:
vector<int> v(a, a+N);
2. 先定义v,其元素个数为N,再使用memcpy将a的值拷贝到v中,代码为:
vector<int> v(N);
memcpy(&v[0], a, sizeof(a));
第2种方法能实现的原因是,vector数组中内部元素采用的是连续内存空间存储的,所以只要找到第一个元素的地址即&v[0]后,即可用memcpy将a中所有的元素拷贝到v中。
vector数组转换为普通数组
将处理后的vector类型的数组再转换为普通数组,可参考上面的第2种方法,用memcpy函数即可实现,代码如下:
memcpy(a, &v[0], sizeof(a));
代码测试实例
#include <iostream> #include <time.h> #include <vector> #include <algorithm> #include <numeric> using namespace std; const int N = 10; void displayData(int *x, int n,string title) { cout<<title.c_str()<<endl; for(int i=0; i<n; i++) { cout<<x[i]<<"\t"; } cout<<endl; } int main() { srand((unsigned int)time(NULL)); int a[N]; for(int i=0; i<N; i++) { a[i] = rand()%100; } displayData (a,N,"a:"); vector<int> v(a, a+N); // vector<int> v(N); // memcpy(&v[0], a, sizeof(a)); cout<<"sum(a) = "<<accumulate(v.begin(),v.end(),0)<<endl<<endl; sort(v.begin(),v.end()); displayData(&v[0],N,"v:"); memcpy(a,&v[0],sizeof(a)); displayData(a,N,"sort(a):"); getchar(); return 0; }
下面通过一个例子说明上面思路的可行性,例子中综合使用了普通数组和vector数组,代码如下:
C++语言进阶知识:普通数组原来也可以和vector数组一起使用
主要代码部分说明如下:
第1-5行,包含的相关头文件,使用vector数组必须包含<vector>,程序中使用了其通用算法和数值运算,所有也包含了<algorithm>和<numeric>
第7行,声明使用std名称空间
第8行,定义数组的大小N为10个元素,注意,要加前缀定义为const常量整数,因为后面定义普通数组大小时,其数组大小值必须为常数
第10-18行,定义一个子函数displayData,用于打印显示出数组中的所有元素
第22-27行,定义长度为10的普通数组a,并为每个元素赋值为0-100之间的随机整数
第30-32行,将普通数组的值传递给vector数组v,其中第30行是用的第1种方法,注释的31-32行是使用的第2种方法,这两种方法是完全等价的
第33行,使用vector数组的数值运算函数accumulate,计算数组a的所有元素之和并输出
第35-36行,使用vector数组的排序函数sort,对vector数组v中的元素进行排序并输出
第38-39行,将排序后vector数组的元素使用memcpy函数再传递到普通数组a中,并输出a中元素的值
经过上面的代码后,就完成了普通数组到vector数组的相互转换,其运行结果如下:
C++语言进阶知识:普通数组原来也可以和vector数组一起使用
总结
从上面的例子中可看出,在一个程序中完全可以将普通数组和vector数组混合使用,充分利用C++模板库中提供的强大的函数库,来简化我们的程序代码,最后再将处理后的结果以普通形式的数组进行输出,以作它用。
本页共37段,1815个字符,4332 Byte(字节)